package bebetes.test;

import java.awt.Color;
import java.util.ArrayList;

import junit.framework.TestCase;
import bebetes.BebeteEmergente;
import bebetes.ChampDeBebetes;

/**
 * Classe de tests pour la classe {@link BebeteEmergente}.
 * <p>
 * On test qu'une bebete se met bien à la vitesse et direction moyenne de celles
 * qu'elle voit et qu'elle évite bien une bébête qui lui passe devant.
 * 
 * @author gnpt
 */
public class BebeteEmergenteTest1 extends TestCase {
	private ChampDeBebetes champ = new ChampDeBebetes(640, 480, 0);
	private BebeteEmergente b1 = null;
	private BebeteEmergente b2 = null;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		this.b1 = new BebeteEmergente(this.champ, this.champ.getHauteur() / 2,
				this.champ.getLargeur() / 2, 0f, 10f, Color.BLUE);
		this.b2 = new BebeteEmergente(this.champ, this.champ.getHauteur() / 2,
				this.champ.getLargeur() / 2, 0f, 10f, Color.RED);
		ArrayList<BebeteEmergente> lesBebetes = new ArrayList<BebeteEmergente>();
		lesBebetes.add(this.b1);
		lesBebetes.add(this.b2);
		this.champ.ajouterBebetes(lesBebetes);
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
		this.b1 = null;
		this.b2 = null;
		this.champ = null;
	}

	/**
	 * Test qu'une bebete se met bien a la vitesse et direction moyenne de
	 * celles qu'elle voit.
	 */
	public void testCalculeDeplacementAFaireAjustement() {
			BebeteEmergente b3 = new BebeteEmergente(this.champ, this.champ
				.getHauteur() / 2, this.champ.getLargeur() / 2, 0f, 10f,
				Color.BLUE);
		BebeteEmergente b4 = new BebeteEmergente(this.champ, this.champ
				.getHauteur() / 2, this.champ.getLargeur() / 2, 0f, 10f,
				Color.BLUE);
		BebeteEmergente b5 = new BebeteEmergente(this.champ, this.champ
				.getHauteur() / 2, this.champ.getLargeur() / 2, 0f, 10f,
				Color.BLUE);
		ArrayList<BebeteEmergente> lesBebetes = new ArrayList<BebeteEmergente>();
		lesBebetes.add(b3);
		lesBebetes.add(b4);
		lesBebetes.add(b5);
		this.champ.ajouterBebetes(lesBebetes);

		// Dés fois que le hasard vienne troubler nos tests !
		b2.setX(-300);
		b2.setY(-200);
		
		b3.setX(55);
		b3.setY(50);
		b3.setVitesseCourante(2f);
		b3.setDirectionCourante(0f);
		b4.setX(52);
		b4.setY(50);
		b4.setVitesseCourante(3f);
		b4.setDirectionCourante(0f);
		b5.setX(55);
		b5.setY(50);
		b5.setVitesseCourante(3f);
		b5.setDirectionCourante(0f);

		this.b1.setX(35);
		this.b1.setY(50);
		this.b1.setVitesseCourante(2f);
		this.b1.setDirectionCourante(0f);
		this.b1.agit();
		this.b1.agit();
		this.b1.agit();
				
		assertTrue("La BebeteEmergente ne se met pas à la vitesse moyenne",
				this.b1.getVitesseCourante() < 3
				&& this.b1.getVitesseCourante() > 2);
	}

	/**
	 * Test qu'elle évite bien une bébête qui lui passe devant.
	 */
	public void testCalculeDeplacementAFaireEvitement() {
		this.b1.setX(50);
		this.b1.setY(40);
		this.b1.setVitesseCourante(2f);
		this.b1.setDirectionCourante(0f);

		this.b2.setX(40);
		this.b2.setY(40);
		this.b2.setVitesseCourante(6f);
		this.b2.setDirectionCourante(0f);

		float oldX = this.b2.getX();

		this.b1.agit(); // 52
		this.b2.agit(); // 44
		
		assertTrue("b2 n'avance pas normalement 1", this.b2.getX() != oldX);
		oldX = this.b2.getX();
		
		this.b1.agit(); // 54
		this.b2.agit(); // 47
		
		assertTrue("b2 n'avance pas normalement 2", this.b2.getX() != oldX);
		this.b1.agit(); // 56
		this.b2.agit(); // 47
		assertTrue("b2 a marché sur b1", this.b2.getX() != this.b1.getX());
	}

	/**
	 * Test des bornes pour les variables x et y.
	 */
	public void testEffectueDeplacementDeBase() {
		float oldv = this.b1.getVitesseCourante();
		float oldd = this.b1.getDirectionCourante();
		this.b1.effectueDeplacement();

		assertTrue("Borne inf x :", this.b1.getX() > 0);
		assertTrue("Borne sup x :", this.b1.getX() < this.champ.getLargeur());

		assertTrue("Borne inf y :", this.b1.getY() > 0);
		assertTrue("Borne sup y :", this.b1.getY() < this.champ.getHauteur());

		assertEquals("Vitesse inchangé", this.b1.getVitesseCourante(), oldv);
		assertEquals("Direction Inchangé", this.b1.getDirectionCourante(), oldd);
	}
}
